package com.nulldev.util.security.hashAPI;

import java.util.Map;

import com.nulldev.util.data.Arrays.maps.FastMaps;
import com.nulldev.util.security.hashAPI.impls.bcrypt.BCryptHash;
import com.nulldev.util.security.hashAPI.impls.keccak.Keccak;
import com.nulldev.util.security.hashAPI.impls.keccak.SHA3;
import com.nulldev.util.security.hashAPI.impls.keccak.SHAKE;
import com.nulldev.util.security.hashAPI.impls.md5.MD5;
import com.nulldev.util.security.hashAPI.impls.murmur.Murmur1;
import com.nulldev.util.security.hashAPI.impls.murmur.Murmur2;
import com.nulldev.util.security.hashAPI.impls.murmur.Murmur3;
import com.nulldev.util.security.hashAPI.impls.sha256.SHA256;
import com.nulldev.util.security.hashAPI.impls.sha512.SHA512;

public class Hashes {

	public static enum Hashables {
		SHA3,
		SHA256,
		SHA512,

		MURMUR1,
		MURMUR2,
		MURMUR3,

		BCRYPT,

		KECCAK,
		SHAKE,

		MD5
	}

	private static final Map<Hashables, Hashable<?>> HASHES = FastMaps.map();
	static {
		if (HASHES.isEmpty()) {
			HASHES.put(Hashables.SHA256, new SHA256(true));
			HASHES.put(Hashables.SHA512, new SHA512(true));

			HASHES.put(Hashables.MURMUR1, new Murmur1());
			HASHES.put(Hashables.MURMUR2, new Murmur2());
			HASHES.put(Hashables.MURMUR3, new Murmur3());

			HASHES.put(Hashables.BCRYPT, new BCryptHash());

			HASHES.put(Hashables.KECCAK, new Keccak());
			HASHES.put(Hashables.SHA3, new SHA3());
			HASHES.put(Hashables.SHAKE, new SHAKE());

			HASHES.put(Hashables.MD5, new MD5());
		}
	}

	public static Hashable<?> get(final Hashables h) {
		if (h == null)
			return null;
		return HASHES.get(h).clone();
	}
}
